home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1980-01-01 | 2.1 KB | 109 lines |
- 1 PRINT;"fast fourier transform - k2uyh - ibm pc --- wa2tif":PRINT
- 2 DIM X1(256),X2(256)
- 4 N=256 : L=8 : P1=3.14159
- 6 REM -- GENERATE TIME FUNCTION --
- 10 REM MODULATED PULSE (1000 HZ)
- 20 FOR Z=0 TO N/4
- 30 X1(Z)=SIN(6283.18*T)
- 40 T=T+0.000195312
- 50 NEXT Z
- 60 FOR Z=N/4 TO N
- 70 X1(Z)=0
- 80 NEXT Z
- 500 PRINT "DO YOU WANT LISTING OF GENERATED FUNC.";
- 510 INPUT A$
- 520 IF A$ = "NO" THEN 640
- 530 IF A$ <> "YES" THEN 500
- 540 B=X1(0)
- 550 FOR Z=0 TO N-1
- 560 IF ABS(X1(Z))>B THEN B=ABS(X1(Z))
- 580 NEXT Z
- 600 FOR Z=0 TO N-1
- 610 PRINT X1(Z);TAB(41+20*X1(Z)/B);"*"
- 620 NEXT Z
- 630 REM SCALE INPUT TIME FUNC.
- 640 FOR Z=0 TO N-1
- 650 X1=X1(Z)/N
- 660 NEXT Z
- 670 REM FFT IN-PLACE ALGORITHM
- 675 PRINT "FFT CALC. IN PROGRESS"
- 680 I1=N/2 : I2=1 : V=2*P1/N
- 690 FOR I=1 TO L
- 700 I3=0 : I4=I1
- 710 FOR K=1 TO I2
- 720 X=INT(I3/I1)
- 730 GOSUB 1300
- 740 I5=Y
- 750 Z1=COS(V*I5)
- 760 Z2=-SIN(V*I5)
- 770 FOR M=I3 TO I4-1
- 780 A1=X1(M) : A2=X2(M)
- 790 B1=Z1*X1(M+I1)-Z2*X2(M+I1)
- 800 B2=Z2*X1(M+I1)+Z1*X2(M+I1)
- 810 X1(M)=A1+B1 : X2(M)=A2+B2
- 820 X1(M+I1)=A1-B1 : X2(M+I1)=A2-B2
- 830 NEXT M
- 840 I3=I3+2*I1 : I4=I4+2*I1
- 850 NEXT K
- 860 I1=I1/2 : I2=2*I2
- 870 NEXT I
- 880 REM - OUTPUT RESULTS -
- 890 PRINT "IN WHAT FORM DO YOU WANT THE OUTPUT ?"
- 900 PRINT " MAGNITUDE SPECTRUM PLOT (1)"
- 910 PRINT " TABLE OF VALUES (2)"
- 920 INPUT A
- 930 IF A=1 THEN 970
- 940 IF A=2 THEN 1130
- 950 PRINT "INCORRECT INPUT (1 OR 2)" : GOTO 890
- 960 REM - OUTPUT MAGNITUDE SPECTRUM PLOT
- 970 B=0
- 975 PRINT " - CALCULATIONS IN PROGRESS -"
- 980 FOR Z=0 TO N/2
- 985 X=Z
- 990 GOSUB 1390
- 1000 IF X3>B THEN B=X3
- 1010 NEXT Z
- 1020 FOR Z=0 TO N/2
- 1025 X=Z
- 1030 GOSUB 1390
- 1040 X4=INT(56*X3/B)
- 1050 C=0
- 1060 PRINT Z;TAB(5);"!";
- 1070 C=C+1
- 1080 IF C<X4 THEN PRINT "="; : GOTO 1070
- 1090 PRINT " "
- 1100 NEXT Z
- 1110 GOTO 1240
- 1120 REM - OUTPUT TABLE OF VALUES -
- 1130 U=0
- 1140 Z=0
- 1150 PRINT "HARMONIC";TAB(14);"REAL";TAB(30);
- 1160 PRINT "IMAGINARY";TAB(50);"MAGNITUDE"
- 1165 X=U
- 1170 GOSUB 1390
- 1180 PRINT U;TAB(10);X1(Y);TAB(30);X2(Y);TAB(50);X3
- 1190 U=U+1 : Z=Z+1
- 1200 IF Z>9 THEN 1140
- 1210 IFU>N/2 THEN 1240
- 1220 GOTO 1165
- 1230 REM - TERMINATE ? -
- 1240 PRINT "DO YOU WANT ANOTHER OUTPUT (YES, NO)";
- 1250 INPUT A$
- 1260 IF A$="YES" THEN 890
- 1270 IF A$<>"NO" THEN 1240
- 1280 END
- 1290 REM - SCRAMBLE SUBROUTINE -
- 1300 Y=0 : N1=N
- 1310 FOR W=1 TO L
- 1320 N1=N1/2
- 1330 IF X<N1 THEN 1360
- 1340 Y=Y+2^(W-1)
- 1350 X=X-N1
- 1360 NEXT W
- 1370 RETURN
- 1380 REM - MAGNITUDE (X3) SUBROUTINE -
- 1390 GOSUB 1300
- 1400 X3=SQR(X1(Y)^2 + X2(Y)^2)
- 1410 RETURN
- 1420 END
-